package com.example.clipsync;

import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.util.Log;

import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;

/**
 * 剪贴板工具类
 * 提供获取系统上下文、读写系统剪贴板等功能
 */
public class ClipboardUtils {
    // 日志标签
    private static final String TAG = "GlobalClipboardLS";

    // 用于记录最后一次写入剪贴板的文本，避免重复处理
    private static volatile String lastWrittenText = null;

    /**
     * 获取最后一次写入剪贴板的文本
     */
    public static String getLastWrittenText() {
        return lastWrittenText;
    }

    /**
     * 获取系统级上下文对象
     * 因为模块运行在 system_server 进程中，需要通过反射获取系统上下文
     * @return 系统上下文对象，如果获取失败则返回 null
     */
    public static Context getSystemContext() {
        try {
            // 通过 ActivityThread 获取当前应用实例
            Class<?> at = XposedHelpers.findClass("android.app.ActivityThread", null);
            Object app = XposedHelpers.callStaticMethod(at, "currentApplication");
            if (app instanceof Context) return (Context) app;

            // 如果上面方法失败，尝试通过 AppGlobals 获取初始应用
            Class<?> ag = XposedHelpers.findClass("android.app.AppGlobals", null);
            Object initApp = XposedHelpers.callStaticMethod(ag, "getInitialApplication");
            if (initApp instanceof Context) return (Context) initApp;
        } catch (Throwable ignored) {}
        return null;
    }

    /**
     * 将文本写入系统剪贴板
     * 当从 WebSocket 服务器接收到消息时调用此方法
     * @param text 要写入剪贴板的文本
     */
    public static void writeToSystemClipboard(String text) {
        if (text == null) return;
        try {
            // 获取系统上下文
            Context ctx = getSystemContext();
            if (ctx == null) {
                return;
            }

            // 获取剪贴板服务
            Object service = ctx.getSystemService(Context.CLIPBOARD_SERVICE);
            if (service instanceof ClipboardManager) {
                ClipboardManager clipboard = (ClipboardManager) service;
                // 创建一个只包含文本的剪贴板数据对象
                ClipData clip = ClipData.newPlainText("remote", text);

                // 在写入剪贴板前设置 lastWrittenText，防止竞态条件
                lastWrittenText = text;
                // 将数据设置到剪贴板
                clipboard.setPrimaryClip(clip);
            }
        } catch (Throwable e) {
            XposedBridge.log(TAG + ": writeToSystemClipboard 错误 -> " + Log.getStackTraceString(e));
        }
    }
}